<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="./styles_main.css" />
<title>Organizing snippets</title>
</head><body>

<ul class="primary-links">
  <li><a href="./index.html">Intro and tutorial</a></li>
  <li><a href="./snippet-organization.html">Howto: organize</a></li>
  <li><a href="./snippet-expansion.html">Howto: expand</a></li>
  <li><a href="./snippet-development.html">Howto: write</a></li>
  <li><a href="./snippet-menu.html">Howto: menu</a></li>
  <li><a href="./faq.html">FAQ</a></li>
  <li><a href="http://yasnippet.googlecode.com/svn/trunk/doc/changelog.html">ChangeLog</a></li>
  <li><a href="http://code.google.com/p/yasnippet/downloads/list">Download</a></li>
</ul>

<p class="original">原文： <a href="http://yasnippet.googlecode.com/svn/trunk/doc/snippet-organization.html">http://yasnippet.googlecode.com/svn/trunk/doc/snippet-organization.html</a>
<span class="translated-date">(translated on 2010/Dec/21)</span>
<a class="link-to-editors-room" href="http://code.google.com/p/yasnippet-doc-jp/">⇒ 翻訳プロジェクト</a>
</p>

<h1>Organizing snippets</h1>

<p class="notice"><strong>〔重要〕</strong> このドキュメントは YASnippet の <strong>SVN trunk</strong> に対して適用されるものです。
SVN trunk は<a href="http://code.google.com/p/yasnippet/source/checkout">こちら</a>から取得できます。
他のバージョンに対するドキュメントは<a href="から取得できます。">こちら</a>で見られます。
</p>

<ul class="toc">
  <li><a href="#loading-snippets">Loading snippets</a></li>
  <li>
    <a href="#id2">Organizing snippets</a>
    <ul>
      <li><a href="#nested-organization">Nested organization</a></li>
      <li><a href="#the-yas-parents-file">The <code>.yas-parents</code> file</a></li>
      <li><a href="#the-yas-make-groups-file">The <code>.yas-make-groups</code> file</a></li>
      <li><a href="#using-plain-file-names">Using plain file names</a></li>
    </ul>
  </li>
  <li><a href="#yasnippet-bundle">YASnippet bundle</a></li>
  <li>
    <a href="#customizable-variables">Customizable variables</a>
    <ul>
      <li><a href="#yas-root-directory"><code>yas/root-directory</code></a></li>
      <li><a href="#yas-ignore-filenames-as-triggers"><code>yas/ignore-filenames-as-triggers</code></a></li>
    </ul>
  </li>
</ul>

<div class="contents">

<h2 id="loading-snippets">スニペットの読み込み</h2>

<p>スニペットの定義は、ファイルシステム上のファイルの中に格納されます。
よりシンプルな &quot;bundle&quot; バージョンを使っているのでなければ、それらのファイルは、YASnippet が <em>snippet table</em> に読み込めるように配置されています。
トリガーメカニズム（<a href="./snippet-expansion.html">Expanding snippets の章</a>を参照）はこの snippet table を調べ、（望むらくは）あなたの意図するスニペットを展開します。
</p>

<p>&quot;normal&quot; バージョンの YASnippet のアーカイブは、それを展開（解凍）した時点で、完全なディレクトリ構成を備えています。
あなたはそれをどこにでも好きなところにコピーして使うことができます。
また、他にもディレクトリを作ったりダウンロードしたりすることができます。
</p>

<p>これらのディレクトリ群を適当な場所に置いたら、その場所を <code>yas/root-directory</code> 変数で参照できるようにしてください。
また、それらのディレクトリ群は関数 <code>yas/load-directory</code> で読み込むようにしてください。
</p>

<div class="highlight"><pre><span style="color: #408080; font-style: italic">;; Develop and keep personal snippets under ~/emacs.d/mysnippets</span>
(<span style="color: #008000; font-weight: bold">setq</span> <span style="color: #19177C">yas/root-directory</span> <span style="color: #BA2121">&quot;~/emacs.d/mysnippets&quot;</span>)

<span style="color: #408080; font-style: italic">;; Load the snippets</span>
(<span style="color: #19177C">yas/load-directory</span> <span style="color: #19177C">yas/root-directory</span>)
</pre></div>

<p>ディレクトリ名を <code>yas/load-directory</code> に直接渡さずに <code>yas/root-directory</code> を介すのは、
&quot;<code>~/emacs.d/mysnippets</code>&quot; をスニペットの開発のための場所として使うためです。
<code>yas/root-directory</code> を介すことで、<code>yas/new-snippet</code> などの「<a href="./snippet-development.html">Writing Snippets</a>」で記述されているようなコマンド群を使うことができるようになります。
</p>

<p>この変数 <code>yas/load-directory</code> は、リストにすることができます。リストにすると、複数の値を格納できます。
</p>

<div class="highlight"><pre><span style="color: #408080; font-style: italic">;; Develop in ~/emacs.d/mysnippets, but also</span>
<span style="color: #408080; font-style: italic">;; try out snippets in ~/Downloads/interesting-snippets</span>
(<span style="color: #008000; font-weight: bold">setq</span> <span style="color: #19177C">yas/root-directory</span> <span style="color: #666666">&#39;</span>(<span style="color: #BA2121">&quot;~/emacs.d/mysnippets&quot;</span>
                           <span style="color: #BA2121">&quot;~/Downloads/interesting-snippets&quot;</span>))

<span style="color: #408080; font-style: italic">;; Map `yas/load-directory&#39; to every element</span>
(<span style="color: #008000">mapc</span> <span style="color: #19177C">&#39;yas/load-directory</span> <span style="color: #19177C">yas/root-directory</span>)
</pre></div>

<p>すぐ上の例では、すべてのディレクトリが読み込まれ、そこにあるスニペットは展開すべきものとみなされます。
それでいながら、開発は依然として最初の要素である &quot;<code>~/emacs.d/mysnippets</code>&quot; で行うことができます。
</p>

<h2 id="id2">スニペットを体系的に整理する</h2>

<p><code>yas/root-directory</code> の設定ができたら、そこで指定したディレクトリのサブディレクトリにスニペットを格納することができます。
</p>

<p>スニペットの定義はプレインテキストファイルに置かれます。
それらのファイルはサブディレクトリに配置されます。
snippet table にはこれらのディレクトリの名前がつけられます。
</p>

<p>snippet table の名前は、あなたがスニペット展開を行わせたい Emacs モードと同じにします。
たとえば、<code>c-mode</code> に対するスニペットは、&quot;<code>c-mode</code>&quot; という名前のサブディレクトリに置きます。
スニペットが置かれたディレクトリを丸ごと無視して、代わりに
「バンドル」を使うこともできます（<a href="#yasnippet-bundle">YASnippet bundle の節</a>を参照）。
</p>


<h3 id="nested-organization">ネストした構成</h3>

<p>いくつかのモード向けのスニペットを含むディレクトリ階層の抜粋を以下に示します：
</p>

<div class="highlight"><pre>$ tree
.
`-- text-mode
    |-- cc-mode
    |   |-- c-mode
    |   |   `-- printf
    |   |-- for
    |   |-- java-mode
    |   |   `-- println
    |   `-- while
    |-- email
    |-- perl-mode
    |   |-- cperl-mode
    |   `-- for
    `-- time
</pre></div>

<p>親ディレクトリは、そのサブディレクトリすべての <em>parent table</em> の役割を果たしています。
これは、異なる Emacs メジャーモードがスニペットの定義を共有するための方法のひとつです。
上の例にあるように、<code>c-mode</code> と <code>java-mode</code> は同じ親 <code>cc-mode</code> を共有しており、<code>cc-mode</code> 向けに定義されている <code>while</code> スニペットを共有しています。
また、すべてのモードは <code>text-mode</code> に由来する <code>time</code> スニペットを共有しています。
</p>

<p>この仕組みは <em>alias</em> （別名）としても使えます。上の例で、<code>cperl-mode</code> は <code>perl-mode</code> を親とする空のディレクトリです。
</p>

<h3 id="the-yas-parents-file"><code>.yas-parents</code> ファイル</h3>

<img class="screenshot" src="./menu-parent.png" alt="a menu sample about a parent table" />

<p>parent table を設定するもうひとつの（より好ましい）方法は、サブディレクトリのひとつに <code>.yas-parents</code> という名前のプレインテキストファイルを置くことです。
こうすると、ディレクトリがネストして複雑になってしまうのを避けることができます。
<code>.yas-parents</code> ファイルの中には、モード名を空白で区切って書くだけです。
このしくみは、スニペットの階層を柔軟に、読みやすくしてくれます。
</p>

<div class="highlight"><pre>$ tree
.
|-- c-mode
|   |-- .yas-parents    # contains &quot;cc-mode text-mode&quot;
|   `-- printf
|-- cc-mode
|   |-- for
|   `-- while
|-- java-mode
|   |-- .yas-parents    # contains &quot;cc-mode text-mode&quot;
|   `-- println
`-- text-mode
    |-- email
    `-- time
</pre></div>

<h3 id="the-yas-make-groups-file"><code>.yas-make-groups</code> ファイル</h3>

<img class="screenshot" src="./menu-groups.png" alt="a menu sample about grouping snippets" />

<p>各モードのディレクトリのひとつに <code>.yas-make-groups</code> という名前の空のプレインテキストファイルを置くと、
これらのサブディレクトリは「スニペットのグループ」とみなされます。
これにより、<a href="./snippet-menu.html">The YASnippet Menu</a> をとてもわかりやすく整理することができます（右の画像のように）。
</p>

<p>同じことをするためのもうひとつの方法は、<code># group:</code> ディレクティブをスニペット定義の中に書くことです。
<a href="./snippet-development.html">Writing Snippets の章</a>を参照してください。
</p>

<div class="highlight"><pre>$ tree ruby-mode/
ruby-mode/
|-- .yas-make-groups
|-- collections
|   |-- each
|   `-- ...
|-- control structure
|   |-- forin
|   `-- ...
|-- definitions
|   `-- ...
`-- general
    `-- ...
</pre></div>

<h3 id="using-plain-file-names">ファイル名をそのまま使う</h3>

<p>通常、ファイル名はスニペット展開の<em>省略形</em>として使われます。（「<em>省略形</em>」は &quot;<em>snippet key</em>&quot; または &quot;<em>snippet trigger</em>&quot; とも呼ばれます ‥‥ <a href="./snippet-expansion.html">Expanding Snippets の章</a>を参照）
</p>

<p>また一方で、変数 <code>yas/ignore-filenames-as-triggers</code> を non-nil に設定するか、<em>または</em>、
<code>.yas-ignore-filename-triggers</code> という名前の空のファイルを置くか、どちらかをすると、
ずっと説明的なファイル名を使えるようになります。
ひとつのモードに対するたくさんのスニペットが同じ trigger key を共有しているような場合にこの仕組みは役に立ちます。
</p>

<div class="highlight"><pre>$ tree rails-mode/
rails-mode/
|-- .yas-make-groups
|-- .yas-ignore-filename-triggers
|-- Insert ERb&#39;s &lt;% __ %&gt; or &lt;%= __ %&gt;.yasnippet
|-- asserts
|   |-- assert(var = assigns(%3Avar)).yasnippet
|   |-- assert_difference.yasnippet
|   |-- assert_no_difference.yasnippet
|   |-- assert_redirected_to (nested path plural).yasnippet
|   |-- assert_redirected_to (nested path).yasnippet
|   |-- assert_redirected_to (path plural).yasnippet
|   |-- assert_redirected_to (path).yasnippet
|   |-- assert_rjs.yasnippet
|   `-- assert_select.yasnippet
</pre></div>

<h2 id="yasnippet-bundle">スニペットのバンドル</h2>

<p>YASnippet 向けのスニペットを定義するもっとも便利な方法は、そのスニペットを使いたいモードに基づいてディレクトリ階層中にスニペット定義を置いて、
<code>yas/load-directory</code> でそれらを読み込むことです。
</p>

<p>しかし、たくさんのスニペットがある場合、この方法だと Emacs の起動スピードが遅くなるかもしれません。
ひとつの Emacs-lisp ファイルの中で特定のモードに対するスニペットをたくさん定義するためには、<code>yas/define-snippets</code> を使うことができます。
</p>

<p>このやり方はメンテナンスが大変なので、もっといい方法があります。
ディレクトリ階層の中でスニペットを定義しておいて、
そのスニペットを変更したら <code>M-x yas/compile-bundle</code> を呼んでスニペット定義をバンドルファイルにコンパイルする、というやり方です。
</p>

<p>リリースされているバンドルファイルは、<code>yas/compile-bundle</code> によって生成されています。
これらのバンドルは、スニペットを定義するために <code>yas/define-snippets</code> を使っています。
これにより、スニペットを読み込む際の I/O および構文解析のオーバヘッドを回避することができます。
</p>

<p>もっと言ってしまうと、生成されたバンドルファイルは独立したファイルであり、<code>yasnippet.el</code> に依存していません。
リリースされているバンドルファイルは、すべてこのやり方で生成されています。
</p>

<p>これらの機能に関する内部ドキュメントとしては以下をご覧ください：
</p>
<ul>
  <li><code>M-x describe-function RET yas/define-snippets RET</code></li>
  <li><code>M-x describe-function RET yas/compile-bundle RET</code></li>
</ul>

<h2 id="customizable-variables">カスタム可能な変数</h2>

<h3 id="yas-root-directory"><code>yas/root-directory</code></h3>

<p>各メジャーモードに対するスニペットを格納しているルートディレクトリ。
</p>

<p>この変数を <code>.emacs</code> で定義する場合、複数のルートディレクトリを指定するために、文字列のリストとすることもできます。
リストにした場合、その最初の要素は常にユーザ作成スニペット用のディレクトリとなります。
それ以外の要素は、<code>yas/reload-all</code> での全スニペットの再読み込みの対象となります。
</p>

<h3 id="yas-ignore-filenames-as-triggers"><code>yas/ignore-filenames-as-triggers</code></h3>

<p>nil で無い場合、ファイル名から trigger key を生成しません。
</p>

<p>このことは、<code># key:</code> ディレクティブの書かれていないスニペットは trigger key を持たない、ということを意味します。
</p>

</div><!-- class="contents" -->

</body></html>
